#ifndef __HASH_H__
#define __HASH_H__
#include<my_header.h>


typedef struct node_s{
  // 双向链表的结点，key存netfd,value存哈希表的下标 
  //存netfd
  int key;
  //存活跃时间
  time_t value;
  struct node_s *pre;
  struct node_s *next;
}node_t;

typedef struct linklist_s{
// 双向链表
  node_t *header;
  node_t *tail;
  //LRU缓存的容量
  int capacity;
  // 当前链表的结点数量
  int cursize;
}linklist_t;

typedef struct hash_s{
   int key; // 哈希表的key
   node_t *index;//指向双向链表的索引
   struct hash_s *next; // 哈希表的下一个结点
}hash_map_t;

typedef struct LRU_cache_s{
  // 哈希桶
  hash_map_t **hash_map;
  // 双向链表
  linklist_t *linklist;
  //哈希表的长度
  int hash_len;
  //初始化锁，锁整个LRU结构
  pthread_mutex_t lock;

}LRU_cache_t;

// 哈希函数
int hash(int key,int hash_size);
//初始化LRU缓存
int LRU_cache_init(LRU_cache_t *lru_cache,int capacity,int hash_len);

// 在哈希表中根据key值查找对应的双向链表
node_t *find_node(LRU_cache_t *lru_cache,int key);

//在双向链表中根据key值查找对应哈希表的下标值
int find_hash_index(LRU_cache_t *lru_cache,int key);

// 插入LRU缓存，头插
int LRU_cache_insert(LRU_cache_t *lru_cache,int key,time_t value);

// 根据key值删除某一个结点
int LRU_cache_delete(LRU_cache_t *lru_cache,int key);

// 根据超时的时间删除LRU的结点,第一个时间传现在的真实时间，第二个传超时时间
int LRU_cache_delete_timeout(LRU_cache_t *lru_cache,time_t time,time_t timeout);

//打印函数
void print_cache(LRU_cache_t *lru_cache);

// 获取当前时间戳
time_t get_current_timestamp();










#endif